//
// Created by YueChuan on 2023/4/30.
//

#ifndef YUECHUAN_HTTP_PARSER_H
#define YUECHUAN_HTTP_PARSER_H

#include "http11_parser.h"
#include "httpclient_parser.h"
#include "http.h"

namespace yuechuan {
    namespace http {
        class HttpRequestParser {

        public:
            typedef std::shared_ptr<HttpRequestParser> ptr;

            /**
             * @brief 默认构造函数
             */
            HttpRequestParser();

            /**
             * @brief 解析协议
             * @details
                        *  使用http_parser_execute方法
                        *  返回值1 成功，-1错误，大于0表示已经处理的字节数，且data中会将已经解析的数据移除
             * @param data 协议文件保存
             * @param len 协议文本长度
             * @return size_t返回世界解析的长度，并且将已经解析的数据移除
             */
            size_t execute(char *data, size_t len);

            /**
             * @brief 是否解析完成
             * @return int
             */
            int isFinished();

            /**
             * @brief 是否有误
             * @return int
             */
            int hasError();

            HttpRequest::ptr getData() const { return m_data; }

            void setError(int v) { m_error = v; }

            /**
             * @brief 获取消息体长度
             * @return uint64
             */
            uint64_t getContentLength();

            /**
             * @brief 获取http_parser结构体
             * @return http_parser::ptr
             */
            const http_parser &getParser() const { return m_parser; }


            /**
             * @brief 返回HttpRequest协议解析的缓存大小
             * @return uint64_t
             */
            static uint64_t GetHttpRequestBufferSize();

            /**
             * @brief 返回HttpRequest协议的最大消息体大小
             * @return uitn64_t
             */
            static uint64_t GetHttpRequestMaxBodySize();

        private:
            /// http_parser
            http_parser m_parser;
            /// HttpRequest结构
            HttpRequest::ptr m_data;

            /// 错误码
            /// 1000: invalid method
            /// 1001: invalid version
            /// 1002: invalid field
            int m_error;
        };

        class HttpResponseParser {
        public:
            typedef std::shared_ptr<HttpResponseParser> ptr;

            /**
             * @brief 构造函数
             */
            HttpResponseParser();

            /**
             * @brief 解析HTTP响应协议
             * @param data 协议数据内存
             * @param len 协议数据内存大小
             * @param chunck 是否分段
             * @return 返回实际解析的长度,并且移除已解析的数据
             */
            size_t execute(char *data, size_t len, bool chunck);

            /**
             * @brief 是否解析完成
             * @return int
             */
            int isFinished();

            /**
             * @brief 是否有错误
             * @return int
             */
            int hasError();

            /**
             * @brief 返回HttpResponse
             * @return HttpResponse::ptr
             */
            HttpResponse::ptr getData() const { return m_data; }

            /**
             * @brief 设置错误码
             * @param v 错误码
             */
            void setError(int v) { m_error = v; }

            /**
             * @brief 获取消息体长度
             * @return uint64_t
             */
            uint64_t getContentLength();

            /**
             * @brief 返回httpclient_parser
             * @return httpclient_parser
             */
            const httpclient_parser &getParser() const { return m_parser; }

            /**
             * @brief 返回HTTP响应解析缓存大小
             * @return uint64_T
             */
            static uint64_t GetHttpResponseBufferSize();

            /**
             * @brief 返回HTTP响应最大消息体大小
             * @return uint64_t
             */
            static uint64_t GetHttpResponseMaxBodySize();

        private:
            /// http_parser
            httpclient_parser m_parser;
            /// HttpResponse结构
            HttpResponse::ptr m_data;

            /// 错误码
            /// 1001: invalid version
            /// 1002: invalid field
            int m_error;
        };
    }
}

#endif //YUECHUAN_HTTP_PARSER_H
